package TouristManagementBO.VisitManagement;

import java.util.Date;
import java.util.List;

import dao.*;
import TouristManagement.*;

public class VisitManagementImpl extends VisitManagementPOA {
	
	private SiteDAO leSiteDAO;
	private VisiteDAO leVisiteDAO;
	private TouristDAO leTouristDAO;
	
	public VisitManagementImpl() {
		super();	
		this.leSiteDAO = new SiteDAO();
		this.leVisiteDAO = new VisiteDAO();
		this.leTouristDAO = new TouristDAO();
		System.out.println("Connected to database");
	}

	@Override
	public boolean verifyVisit(short idSite, short touristCardNumber) {
		//true if visited
		//false if not
		return leVisiteDAO.verifyVisit(idSite, touristCardNumber);		
	}

	/*
	 * getter la duree moyenne des visites du site
	 * input : idSite
	 * output : la duree moyenn ou -1 si problème
	 */
	public short getdurationAverage(short idSite) {
		return leSiteDAO.getdurationVisitMoyen(idSite);
	}

	/*
	 * get la duree visite max du site
	 * input : idSite
	 * output : la duree ou -1 si problème
	 */
	public short getdurationMax(short idSite) {
		return leSiteDAO.getdurationVisitMax(idSite);
	}

	/*
	 * get duree visite min du site
	 * input : idSite
	 * output : la duree ou -1 si problème
	 */
	public short getdurationMin(short idSite) {		
		return leSiteDAO.getdurationVisitMin(idSite);
	}

	/*
	 * updater l'horaire de sortie d'une visite
	 * input : idSite, numero carte tourist
	 * output : true si OK, false si erreur
	 */
	
	public boolean updateVisitEndHour(short idSite,short touristCardNumber) {
		return leVisiteDAO.updateVisitEndHour(touristCardNumber, idSite);		
	}

	/*
	 * ajouter un avis d'un touriste
	 * input : idSite, numero carte tourist, l'avis
	 * output : true si OK, false si erreur
	 */
	public boolean addAdvice(short idSite, short touristCardNumber, Advice theAdvice) {
		return leVisiteDAO.addAdvice(touristCardNumber, idSite, theAdvice);		
	}	

	/*
	 * get avis moyenne
	 * return -1 si erreur
	 */
	public Advice getAdviceAverage(short idSite) {
		int i = (int) leVisiteDAO.getAdviceAverageSite(idSite); 
		if (i<0) return null;
		else if (i<1)return Advice.NotInteresting;
		else if (i<2)return Advice.Marginal;
		else if (i<3)return Advice.Interesting;
		else if (i<4)return Advice.Worthly;
		else return Advice.MustVisit;	
	}

	/*
	 * get le site en train d'etre visite par le tourist
	 * return idSite, -1 si erreur
	 */
	public short getVisitingSite(short touristCardNumber) {
		return leVisiteDAO.getVisitingSite(touristCardNumber);
	}

	/*
	 * get l'horaire ouverture d'un site
	 * return Horaire, null si erreur
	 */
	public Hours getHoraireOuverture(short idSite) {
		return leSiteDAO.getHoraireOuverture(idSite);
	}

	/*
	 * get l'horaire fermeture d'un site
	 */
	public Hours getHoraireFermeture(short idSite) {
		return leSiteDAO.getHoraireFermeture(idSite);
	}

	/*
	 * get le nombre de visiteurs actuel du site
	 */
	public short getNbVisiteurActuel(short idSite) {
		return leSiteDAO.getNbVisiteurActuel(idSite);
	}

	/*
	 * get le nombre de visiteurs maximal du site
	 */
	public short getNbVisiteurMaximal(short idSite) {
		return leSiteDAO.getNbVisiteurMaximal(idSite);
	}

	/*
	 * créer un nouveau tourist dans la base
	 */
	@SuppressWarnings("deprecation")
	public short createTourist(String nomTourist, DateV dateDeb, DateV dateFin) {
		Date start = new Date();
		Date end = new Date();
		start.setDate(dateDeb.day);
		start.setMonth(dateDeb.month-1);
		start.setYear(dateDeb.year-1900);
		end.setDate(dateFin.day);
		end.setMonth(dateFin.month-1);
		end.setYear(dateFin.year-1900);		
		return leTouristDAO.addTourist(nomTourist, start, end);
	}

	/*
	 * get les coordonnées GPS du site
	 */
	public CoordsGPS getCoordsGPS(short idSite) {
		return leSiteDAO.getCoordGPS(idSite);
	}

	/*
	 * get un liste d'id de tous les sites dans la base
	 */
	public short[] getIdSite() {
		List<Short> temp = leSiteDAO.getIdSite();
		short[] result = new short[temp.size()];
		int n=0;
		for (short s:temp) {
			result[n] = s;
			n++;
		}
		return result;
	}

	/*
	 * get le nom d'un site
	 */
	public String getNomSite(short idSite) {		
		return leSiteDAO.getNameSite(idSite);
	}

	/*
	 * enregistrer une visite dans la base lors d'un entrée d'un tourist
	 */
	public boolean addVisit(short idSite, short touristCardNumber) {		
		return leVisiteDAO.addVsite(idSite, touristCardNumber);
	}

	/*
	 * vérifier si le tourist exist dans la base
	 */
	public boolean existTourist(short touristCardNumber) {
		return leTouristDAO.existTourist(touristCardNumber);
	}
	
	/*
	 * get la séquence visite favorie 
	 */	
	public String getVisitSequence(){
		return leVisiteDAO.getVisitSequenceFavorite();
	}
	
	/*
	 * get la date de début de validité de la carte tourist
	 */
	public DateV getDateDebValid(short touristCardNumber) {
		return leTouristDAO.getDateStartValidate(touristCardNumber);		
	}

	/*
	 * get la date de fin de validité de la carte tourist
	 */
	public DateV getDateFinValid(short touristCardNumber) {		
		return leTouristDAO.getDateFinValidate(touristCardNumber);
	}
	
	/*
	 * get l'afflence quotidienne du site
	 */
	public short getAffluenceQuotidienne(short idSite) {
		return leSiteDAO.getAffluenceQuotidienne(idSite);
	}

	@Override
	public boolean isVisitingSite(short touristCardNumber) {
		return leVisiteDAO.isVisitingSite(touristCardNumber);
	}
}
